home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / knowhow4 / icon.cpp < prev    next >
C/C++ Source or Header  |  1994-10-10  |  5KB  |  205 lines

  1. #include "icon.h"
  2. #include "process.h"
  3. #include "image_p.h"
  4.  
  5. void save_image(char* fName, loc pos, int type)
  6.     {
  7.     int i_size;    // save icon
  8.     loc size = icon_size(type);
  9.     i_size = (size.X + 1 + 7) / 8 * 4 * (size.Y + 1)+ sizeof(imageP);
  10.     void* image = (void*)malloc(i_size + 10);
  11.     getimage(pos.X, pos.Y, pos.X + size.X, pos.Y + size.Y, image);
  12.     FILE *stream;
  13.     if(!((stream = fopen(fName, "a+b")) == NULL))
  14.     fwrite(image, i_size, 1, stream); /* write to file */
  15.     fclose(stream); /* close file */
  16.     delete image;
  17.     }
  18. /////////////////////////
  19. imageP get_image(char* fName, int type, int num)
  20.     {
  21.     FILE *stream;
  22.     if((stream = fopen(fName, "r+b")) == NULL)
  23.     return NULL;
  24.     loc size = icon_size(type);
  25.     int i_size = ((size.X + 1 + 7) >> 3 << 2) * (size.Y + 1) + sizeof(imageP);
  26.     imageP image = (imageP)malloc(i_size + 10);
  27.     get_image(stream, num, image, i_size);
  28.     fclose(stream);
  29.     return image;
  30.     }
  31. /////////////////////////
  32. void get_image(FILE* stream, int num, imageP image, int i_size)
  33.     {
  34.     long pos = (long)i_size * (num - 1);
  35.     fseek(stream, pos, SEEK_SET);
  36.     fread(image, i_size, 1, stream);
  37.     }
  38. ///////////////////////////////
  39. void Icon::show()
  40.     {
  41.     imageP im;
  42.     if((im = extract()) == NULL)
  43.     return;
  44.     mouseHideCursor();
  45.     rect dest = screenRect(rectangle);
  46.     put_image_correct(im, dest);
  47.     Frame::show();
  48.     delete im;
  49.     mouseShowCursor();
  50.     }
  51. ////////////////////////
  52. void Icon::press()
  53.     {
  54.     hilite();
  55.     Press::press();
  56.     }
  57. ////////////////////////
  58. void Icon::release()
  59.     {
  60.     unhilite();
  61.     Press::release();
  62.     }
  63. ////////////////////////
  64. void Icon::icon_set(loc c, int n)
  65.     {
  66.     rectangle =    rect(c, c + pScreenSet->icon_types[type]);
  67.     num = n;
  68.     }
  69. //////////////////////////
  70. char* Icon::icon_open()
  71.     {
  72.     char* resName;
  73.     switch(pScreenSet->g_driver)
  74.     {
  75.     case EGA:
  76.         switch(pScreenSet->g_mode)
  77.         {
  78.         case EGALO:
  79.             switch(type)
  80.             {
  81.             case 1: resName = "egalo1.res"; break;
  82.             case 2: resName = "egalo2.res"; break;
  83.             case 3: resName = "egalo3.res"; break;
  84.             }
  85.             break;
  86.         case EGAHI:
  87.             switch(type)
  88.             {
  89.             case 1: resName = "egahi1.res"; break;
  90.             case 2: resName = "egahi2.res"; break;
  91.             case 3: resName = "egahi3.res"; break;
  92.             }
  93.             break;
  94.         }
  95.         break;
  96.     case VGA:
  97.         switch(pScreenSet->g_mode)
  98.         {
  99.         case VGALO:
  100.             switch(type)
  101.             {
  102.             case 1: resName = "egalo1.res"; break;
  103.             case 2: resName = "egalo2.res"; break;
  104.             case 3: resName = "egalo3.res"; break;
  105.             }
  106.             break;
  107.         case VGAMED:
  108.             switch(type)
  109.             {
  110.             case 1: resName = "egahi1.res"; break;
  111.             case 2: resName = "egahi2.res"; break;
  112.             case 3: resName = "egahi3.res"; break;
  113.             }
  114.             break;
  115.         case VGAHI:
  116.             switch(type)
  117.             {
  118.             case 1: resName = "vgahi1.res"; break;
  119.             case 2: resName = "vgahi2.res"; break;
  120.             case 3: resName = "vgahi3.res"; break;
  121.             }
  122.             break;
  123.         }
  124.         break;
  125.     }
  126.     return resName;
  127.     }
  128. //////////////////////////
  129. imageP Icon::extract()
  130.     {
  131.     char* resName = icon_open();
  132.     return get_image(resName, type, num);
  133.     }
  134. ////////////////////////////////
  135. void Icon::hilite()
  136.     {
  137.     rect r = screenRect(rectangle);
  138.     void* image = (void*)malloc(imagesize(r.origin.X, r.origin.Y,
  139.                 r.corner.X, r.corner.Y));
  140.     getimage(r.origin.X, r.origin.Y,
  141.          r.corner.X, r.corner.Y, image);
  142.     putimage(r.origin.X, r.origin.Y, image, NOT_PUT);
  143.     delete image;
  144.     }
  145. //////////////////////////
  146. loc icon_size(int icon_type)
  147.     {
  148.     loc size;
  149.     switch(icon_type)
  150.     {
  151.     case 1: size = pScreenSet->ICON_PIXELS_1;
  152.         break;
  153.     case 2: size = pScreenSet->ICON_PIXELS_2;
  154.         break;
  155.     case 3: size = pScreenSet->ICON_PIXELS_3;
  156.         break;
  157.     }
  158.     return size;
  159.     }
  160. ////////////////////////////
  161. /*
  162. void main()
  163.     {
  164.     if(!init_KNOW_HOW())
  165.         return;
  166.     setfillstyle(SOLID_FILL, pColorSet->colors.BAK_COLOR);
  167.     bar(0, 0, getmaxx(), getmaxy());
  168.  
  169.     Icon i(loc(1, 1), 2, LARGE_ICON, SHOW_BORDER);
  170.     i.show();
  171.     i.exe();
  172.  
  173.     close_KNOW_HOW();
  174.     closegraph();
  175.     }
  176. */
  177. /*
  178. void main()
  179.     {
  180.     if(!init_KNOW_HOW())
  181.         return;
  182.     setfillstyle(SOLID_FILL, pColorSet->colors.BAK_COLOR);
  183.     bar(0, 0, getmaxx(), getmaxy());
  184.  
  185.     Icon i(loc(1, 1), 2, LARGE_ICON, SHOW_BORDER);
  186.     char* file = i.icon_open();
  187.  
  188.     FILE *stream;
  189.     if((stream = fopen(file, "r+b")) == NULL)
  190.     return;
  191.     loc size = icon_size(LARGE_ICON);
  192.     int i_size = ((size.X + 1 + 7) >> 3 << 2) * (size.Y + 1) + sizeof(imageP);
  193.     imageP image = (imageP)malloc(i_size + 10);
  194.     for(int k = 0; k < 10; k++)
  195.         for(int j = 1; j < 15; j++)
  196.             {
  197.             get_image(stream, j, image, i_size);
  198.             putimage(10, 10, image, COPY_PUT);
  199.             }
  200.     fclose(stream);
  201.     delete image;
  202.     close_KNOW_HOW();
  203.     closegraph();
  204.     }
  205. */